# Sincronizador de datos utilizando WebServices, requiere la direccion 
# del wsdl del servidor
# Fernando Mancia

import sys, os
import cPickle as pickle

from dao.AlumnosDao import AlumnosDao
from dao.Alumnos_LeccionesDao import Alumnos_LeccionesDao
from dao.EscuelasDao import EscuelasDao

from model.Alumnos import Alumnos
from model.Escuelas import Escuelas
from model.Sesion import Sesion
from model.Alumnos_Lecciones import Alumnos_Lecciones

from sugar.activity import activity
from sugar.datastore import datastore

# Importar el package WSDL, lo colocamos dentro de la aplicacion
from SOAPpy import WSDL
wsdlUrl = 'http://www.fundacionparaguaya.org.py/aema/server.php?wsdl'

class sync():

    def __init__(self):
	print "Creando el sincronizador"
        # Crear una interfaz del web-service
	try:
		self.wsServer = WSDL.Proxy(wsdlUrl)
	except:
		print "\n\nERROR al instanciar el SINCRONIZAR PROXY:", sys.exc_info()[0]

        # Crear la interfaz del datastore
	self.alumnoDao = AlumnosDao()
	self.alumnoLeccionDao = Alumnos_LeccionesDao()
	self.escuelasDao = EscuelasDao()
	
    def sincronizar(self):
	a = "Exitoso"
	try:
		self.obtenerEscuelas()
		self.registrarAlumno()
		self.registrarAlumnosClases()
		self.obtenerClasesHabilitadas()
		self.registrarAlumnosEncuestas()
	except:
		print "\n\nERROR al SINCRONIZAR:", sys.exc_info()[0]
		a = " No disponible. "  # + str(sys.exc_info()[0])
	return a



###   Funciones de sincronizacion 

    def registrarAlumno(self):
	print "\nINI - REGISTRAR ALUMNO \n"
	alum = self.alumnoDao.obtener()

	if alum != None:
	
		alumStr = alum.toString("#@#")
		print "Se envia: alum.idAlumno ="+ str(alum.idAlumno)
		print "Se envia: alum.nombre ="+ str(alum.nombre)
		print "Se envia: alum.apellido ="+ str(alum.apellido)
		print "Se envia: alum.serial ="+ str(alum.serial)
		print "Se envia: alum.idescuela ="+ str(alum.idEscuela)
		print "Se envia: Fin de envio"

		try: 	
			resultado = self.wsServer.registrarAlumno(alum.idAlumno, alum.nombre, alum.apellido, alum.serial, alum.idEscuela, alum.edad, alum.cantpersonas )

		except:
			resultado = "ERROR-WS: registrarAlumno = "+str(sys.exc_info()[0])
	
		cant = resultado.lower().count("error")
		if cant <= 0 :
			a = self.str2alumno(resultado)
			self.alumnoDao.guardar(a)
	
		print "Resultado = "
		print resultado
		print "\nFIN - REGISTRAR ALUMNO \n" 
		return resultado
	else:
		print "No existe alumno"
		print "\nFIN - REGISTRAR ALUMNO \n" 
		return None
	




    def registrarAlumnosClases(self):
	print "\nINI - REGISTRAR ALUMNOS CLASES \n" 

	alum = self.alumnoDao.obtener()
        listaClases = self.alumnoDao.obtenerListaAlumnoLecciones()
	clasesHechas = ""
	for k, v in listaClases.iteritems():
		clasesHechas = clasesHechas + "@@@" + str(k)
	try:
		resultado = self.wsServer.registrarAlumnosClases(alum.idAlumno, clasesHechas)
	except:
		resultado = "ERROR-WS: registrarAlumnosClases = ", sys.exc_info()[0]

	print "Resultado = "
	print resultado
	print "\nFIN - REGISTRAR ALUMNOS CLASES \n" 
	return resultado


    def registrarAlumnosEncuestas(self):
	print "\nINI - REGISTRAR ALUMNOS ENCUESTAS \n" 

	alum = self.alumnoDao.obtener()
        listaEncuestas = self.alumnoDao.obtenerListaAlumnoEncuestas()
	resultado = ""
	try:
		for k, v in listaEncuestas.iteritems():
			k = k.strip()
			e = k.split("#")
			idencuesta = e[0]
			identificador = e[1]
			valor = v
			t = self.wsServer.registrarAlumnosEncuestas(alum.idAlumno, idencuesta, identificador, valor)
			resultado = resultado + "-" + t 
	except:
		resultado = "ERROR-WS: registrarAlumnosClases = ", sys.exc_info()[0]

	print "ResultadoGlobal = "
	print resultado
	print "\nFIN - REGISTRAR ALUMNOS ENCUESTAS \n" 
	return resultado


    def obtenerEscuelas(self):
        print "\nINI - Obtener Escuelas\n"
	try:
	        resultado = self.wsServer.obtenerEscuelas() 
        	l = list()  
        	for r in resultado:
	            o = self.str2escuela(r)
        	    l.append(o)
		self.escuelasDao.guardarLista(l)
	except:
		resultado = "ERROR-WS: obtenerEscuelas = ", sys.exc_info()[0]

	print "Resultado = "
	print resultado
	print "\nFIN - Obtener Escuelas\n"     
	return resultado


    def obtenerClasesHabilitadas(self):
	print "\nINI - Obtener Clases Habilitadas\n"     
	try:
		alum = self.alumnoDao.obtener()
		print "Se envia, alum.idEscuela = " + str(alum.idEscuela)
	        resultado = self.wsServer.obtenerClasesHabilitadas(alum.idEscuela) 
        	l = list()  
        	for idclase in resultado:
        	    l.append(idclase)
		self.escuelasDao.guardarClasesHabilitadas(l)
	except:
		resultado = "ERROR-WS: obtenerClasesHabilitadas = ", sys.exc_info()[0]

	print "Resultado = "
	print resultado
	print "\nFIN - Obtener Clases Habilitadas\n"     
	return resultado


## Funciones de conversion 

    def str2escuela(self, strEscuelaParam):
        sep = "#@#"
        strEscuela = strEscuelaParam.strip()
        e = strEscuela.split(sep)
        #print "\nSplit = "
        #print e
        obj = Escuelas(e[0], e[1], e[2])
        return obj 

    def str2alumno(self, strAlumnoParam):
        sep = "#@#"
        strAlumno = strAlumnoParam.strip()
        e = strAlumno.split(sep)
        obj = Alumnos(e[0], e[1], e[2], e[3], e[4], e[5], e[6])
        return obj 

'''
WS LLAMADOS:
  * self.wsServer.registrarAlumno(alum.idAlumno, alum.nombre, alum.serial, alum.idEscuela)
  * self.wsServer.obtenerEscuelas() 
  * self.wsServer.obtenerClasesHabilitadas()
  * registrarAlumnosClases

'''


def main():

	#Registro Local del alumno
	alumno = Alumnos('serialnuevo', 'Fernandoup', 'upMancia', 'miserialsssXYZ', 1)
	adao = AlumnosDao()
	edao = EscuelasDao()
	adao.guardar(alumno)

	#Prueba de los WS
	s = sync()

	# R1
	R1 = s.registrarAlumno()
	print "R1"
	print R1

	# R2
	R2 = s.obtenerEscuelas()
	print "R2"
	print R2
	le = edao.obtenerLista()
	for esc in le:
		print esc.idEscuela + esc.nombre


	# R3
	R3 = s.obtenerClasesHabilitadas()
	print "R3"
	print R3
	chab = edao.obtenerClasesHabilitadas()
	for c in chab:
		print "Clase Habilitada = " + c
	

	R4 = s.registrarAlumnosClases()

	'''
	R1 = ws.registrarAlumno('serial122', 'ferchu man', 'mancia', 'serial ddd', 0)
	print "R1 = " + R1

	R2 = ws.registrarAlumnosClases('serial122', ['1#2','1#3','2#1','3#2'])
	print "\nR2 = " + R2


	R3 = ws.obtenerEscuelas()
	print "\nR3"
	print R3
	for estr in R3:
		#e = s.str2escuela(estr)
		print estr # e.idEscuela + " " + e.nombre + " " + e.ciudad
	
	R4 = ws.obtenerClasesHabilitadas(2)
	print "\nR4"
	for e in R4:
		print e
	'''

if __name__ == '__main__':
   main()

